package com.demo.java.OD151_200.OD190;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【最近的点】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145884182
 */
public class OdMain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取集合 A 和 B 的大小以及范围 R
        int sizeA = scanner.nextInt();
        int sizeB = scanner.nextInt();
        int range = scanner.nextInt();

        // 读取集合 A 和 B
        int[] arrA = new int[sizeA];
        int[] arrB = new int[sizeB];

        for (int i = 0; i < sizeA; ++i) {
            arrA[i] = scanner.nextInt();
        }
        for (int i = 0; i < sizeB; ++i) {
            arrB[i] = scanner.nextInt();
        }

        // 对集合 A 和 B 进行升序排序
        Arrays.sort(arrA);
        Arrays.sort(arrB);

        // 调用方法处理并输出结果
        solveMethod(range, arrA, arrB);

        // 关闭 scanner
        scanner.close();
    }

    // 通过双指针法找到符合条件的对
    private static void solveMethod(int range, int[] arrA, int[] arrB) {
        int pA = 0; // 指针 pA 指向集合 A
        int pB = 0; // 指针 pB 指向集合 B

        // 遍历集合 A 和 B
        while (pA < arrA.length && pB < arrB.length) {
            int diff = arrB[pB] - arrA[pA]; // 计算 B(j) - A(i) 的差值
            if (diff >= 0 && diff <= range) {
                // 如果差值在 [0, R] 范围内，输出当前的 (A(i), B(j)) 对
                System.out.println(arrA[pA] + " " + arrB[pB]);
                pA++; // 移动指针 pA 到下一个
            } else if (diff < 0) {
                // 如果 A(i) >= B(j)，移动指针 pB
                pB++;
            } else {
                // 如果差值大于 R，移动指针 pA
                pA++;
            }
        }
    }
}